# 作业：
""
"""
一、定义一个学生Student类。有下面的类属性：
1 姓名 name
2 年龄 age
3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
类方法：
 1 获取学生的姓名：get_name() 返回类型:str
2 获取学生的年龄：get_age() 返回类型:int
3 返回3门科目中最高的分数。get_course() 返回类型:int
4 将每个实例学生对象写进txt文件里，要持久保存
举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
5 获取所有学生的信息
写好类以后，可以定义2个同学测试下:
zm = Student('zhangming',20,[69,88,100])
"""
# class Student:
#     def __init__(self,name,age,score):
#         self.name=name
#         self.age=age
#         self.score=score
#         def get_name(self)->str:
#             return self.name
#         def get_age(self)->int:
#             return self.age
#         def get_course(self)->int:
#             return max(self.score)
# if __name__ == '__main__':
#     p1=Student("a",29,{"语文":99,"数学":100,"英语":85})
#     print(p1.__dict__)

class Student:
    def __init__(self,name,age,score:list):  #score:list 中的 list 是一个类型提示，它表示期望传给 score 参数的值应该是一个列表
        self.name = name
        self.age = age
        self.score = score
        str1 = "{'姓名':%s,'年龄':%s,'成绩':{'语文':%s,'数学':%s,'英语':%s}}\n" % (
            self.name, self.age, self.score[0], self.score[1], self.score[2])
# %s 是一种占位符，用于将后面的变量以字符串的形式插入到该位置。
# \n 在字符串末尾添加了一个换行符。
        with open('student.txt', 'r', encoding='utf-8') as f:
#         with: 这是 Python 中用于管理资源的一个关键字。'r': 表示以只读模式打开文件。这意味着你只能读取文件内容而不能修改它。
# encoding='utf-8': 指定文件的编码格式为 UTF-8 as f: 将打开的文件对象赋值给变量 f，这样就可以通过这个变量对文件进行操作
            all = f.readlines() #f.readlines(): 这是一个方法调用，用于从文件对象 f 中读取所有行，并返回一个列表，其中每个元素是一行文本
        if str1 not in all: #判断是否已存在该学生记录
            with open('student.txt','a',encoding='utf-8') as f:
    def get_name(self):
        return self.name
    def get_age(self):
        return self.age
    def get_course(self):
        max_score = self.score[0]
        for i in self.score:
            if i>max_score:
                max_score=i
        return f'返回3门科目中最高的分数是:{max_score}'
    def get_all_studentInfo(self):  #定义了一个类方法 get_all_studentInfo
        with open('student.txt','r',encoding='utf-8')as f:
            all_data=f.readlines()
        for i,k in enumerate(all_data):
            print(f'第{i+1}个学生姓名为：{k}') #索引值 (i + 1): 使用 i + 1 来使索引从 1 开始，这样更符合人类习惯（通常我们从1开始计数）
if __name__ == '__main__':
    s1=Student('小白',25,[89,99,67])
    s2=Student('王二麻子',18,[56,77,69])
    print(s1.get_name())  #调用get_name方法
    print(s1.get_age())  #调用get_age方法
    print(s1.get_course()) #调用get_course方法
    print(s1.get_all_studentInfo()) #调用get_all_studentInfo方法



# 二、定义一个字典类：dictclass。完成下面的功能：
# 1 删除某个key
# 2 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
# 3 返回键组成的列表：返回类型;(list)
# 4 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)\
# class dictclass:
#     def __init__(self,mydict):
#         self.mydict=dict
#     def __int__(self,key):
#         self.key=key
#         if key in self.mydict:
#             del self.mydict
#         return self.mydict
#     def get_key_value(self,key):
#         return self.mydict.get(key, "not found")
#     def get_key_list(self,list:list):
#         return list(self.mydict.keys())
#     def merge_values(self,values):
#         return merge_values






# 三、定义一个列表的操作类：Listinfo
# 包括的方法:
# 1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
# 2 列表元素取值：get_key(num) [num:整数类型]
# 3 列表合并：update_list(list) [list:列表类型]
# 4 删除并且返回最后一个元素：del_key()



# 四、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！



# 五、点餐管理系统
# 1》、餐馆可以新增菜品、下架菜品、修改菜品
# 2》、每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1
# 菜品有对应的价格，餐厅老板定义价格每道菜不允许超过15元，没有小数单位，均为整数
# 3》、餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分
# 4》、有菜品评分提报功能，对平均分数（菜品总分/打分人数）低于3分的菜品进行强制下架；



# 六、定义一个桌子类（Desk），包含长（length）、宽（width）、高（height）属性，
# 包含一个打印桌子信息属性的方法（showInfo）。实例化2个桌子对象，为其赋予不同的属性值，
# 并调用showInfo方法，输出每个桌子的信息。
# class Desk:
#     def __init__(self,length,width,height):
#         self.length=length
#         self.width=width
#         self.height=height
#     def showInfo(self):
#         print(f"桌子尺寸：长 {self.length},宽{self.width},高{self.height}")
# if __name__ == '__main__':
#     D1=Desk(100,80,90)
#     D2=Desk(70,60,50)
#     D1.showInfo()
#     D2.showInfo()


# 七、定义一个用户类(User),用户名(username)和密码(password)是这个类的属性。
# class User:
#     def __init__(self,username,password):
#         self.username=username
#         self.password=password

# 八、定义一个计算器类，有加减乘除四个方法
# class Cauclate:
#     def __init__(self,num1,num2):
#         self.num1=num1
#         self.num2=num2
#     def jia(self):
#         return self.num1+self.num2
#     def jian(self):
#         return self.num1-self.num2
#     def cheng(self):
#         return self.num1*self.num2
#     def chu(self):
#         if self.num1 !=0:
#          return self.num1/self.num2
#         else:
#          return("除数不能为0")
# if __name__ == '__main__':
#     p1=Cauclate(0.1,0.2)
#     print(f"加法结果是{p1.jia()}")
#     print(f"减法结果是{p1.jian()}")
#     print(f"乘法结果是{p1.cheng()}")
#     print(f"除法结果是{p1.chu()}")

# 九、创建一个名为Person的类，具有以下属性和方法：
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
# class Person:
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#     def greet(self):
#         print(f"你好，我的名字是{self.name}，今年{self.age}岁。")
# if __name__ == '__main__':
#     p1=Person("小白",18)
#     p1.greet()


# 十、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果

# 十一、创建一个名为"Car"的类，该类具有"品牌"和"颜色"属性。
# 创建一个"start_engine"方法，该方法打印出"启动汽车引擎！"的消息。
# 创建一个"stop_engine"方法，该方法打印出"关闭汽车引擎！"的消息
# class Car:
#     def __init__(self,pinpai,color):
#         self.pinpai=pinpai
#         self.color=color
#     def start_engine(self):
#         print(f"启动汽车引擎消息！{self.pinpai} {self.color} ")
#     def stop_engine(self):
#         print(f"关闭汽车引擎！{self.pinpai} {self.color}")
# if __name__ == '__main__':
#     c1=Car("揽胜","白色")
#     c1.start_engine()
#     c2= Car("宝马","黑色")
#     c2.stop_engine()



# 十二、淘宝商家后台，可以上架商品、下架商品，功能如下：
#  （1） 可以添加商品，商家添加完的商品会存到商品列表
#  1.1  商品要有名称、sku、价格
#  （2） 可以修改商品信息：名称、sku、价格
#  （3） 可以对商品进行下架，下架后的商品不再展示
# class Good:
#     def __init__(self,name,sku,price):
#         self.name=name
#         self.sku=sku
#         self.price=price
# if __name__ == '__main__':
#     G1=Good("乐事",101,10)
#     print(G1)
#     G1.name="好有趣"
#     G1.sku=202
# 十三、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤
# class Person:
#     hobby = "run"
#     def __init__(self,name,weight):
#         self.name=name
#         self.weight=weight
#     def run(self):
#         self.weight-=0.5
#         print(f"{self.name} 跑步了，体重减少了0.5公斤，现在是 {self.weight:.1f} 公斤")
#     def eat(self):
#         self.weight+=1
#         print(f"{self.name} 吃东西了，体重增加了1公斤，现在是 {self.weight:.1f} 公斤")
# xiaoming=Person(name='小明',weight=75.0)
# xiaomei=Person(name='小美',weight=45.0)
# xiaoming.run()
# xiaomei.run()
# print(f"{xiaoming.name}的体重{xiaoming.weight}")
# print(f"{xiaomei.name}的体重{xiaomei.weight}")
# print(f"{xiaoming.name} 的爱好是：{xiaoming.hobby}")
# print(f"{xiaomei.name} 的爱好是：{xiaomei.hobby}")



# 十四、士兵瑞恩有一把ak47
# 士兵可以开火（开火扣动的是扳机）
# 枪能够发射子弹（把子弹打出去）
# 抢能够装子弹–增加子弹数量
# 要求没子弹，需要输出没有子弹了，且发射失败
#
# 【部署下服务器的Mysql，明天会用到】
















# # 类定义的语法
# """
# class :定义类的关键字
# class Person： Person是类名 首字母 要大写
#
# """
# class Person:
#     money=100
#     def __init__(self,name,age,sex,phone,address,email):
#         """
#         __xxx__:双下划线，都是魔术方法
#         __init__:初始化，所有根据这个类创建出来的对象，都会走到这里
#         """
#         self.name=name
#         self.age=age
#         self.sex=sex
#         self.phone=phone
#         self.address=address
#         self.email=email
#         """"
#         self:表示对象可以使用的实例属性，self也表示对象
#              只有加了self,整篇才可以找到它并使用
#         """
# #     函数/方法/技能
#     def course(self):
#         print(self)
#         # print('course')
#         return "小白"
# if __name__=='__main__':  #整篇py文件的执行入口
#      # 通过Person类，创建对象:p1
#     p1=Person("小白",18,"女","1234567890","沈阳","308768698@qq.com")
#     p1.course()  #  通过对象调用类方法
#     # print(p1.__dict__) #查看对象本身实例属性 {'name': '小白', 'age': 18, 'sex': '女', 'phone': '1234567890', 'address': '沈阳', 'email': '308768698@qq.com'}
#
#     p1.play='听音乐'
#     # print(p1.__dict__)  #{'name': '小白', 'age': 18, 'sex': '女', 'phone': '1234567890', 'address': '沈阳', 'email': '308768698@qq.com', 'play': '听音乐'}
#
#
# #     创建p2对象
# #     不同的对象之间，实例属性是相互隔离的
#     p2=Person("张鑫",19,"女","0987654321","重庆","10690563@qq.com")
#     # print(p2.__dict__) #{'name': '张鑫', 'age': 19, 'sex': '女', 'phone': '0987654321', 'address': '重庆', 'email': '10690563@qq.com'}
#
# #     可以修改对象属性
#     p1.name="王经尧"
#     # print(p1.name) #王经尧
#     # print(p1.__dict__) #{'name': '王经尧', 'age': 18, 'sex': '女', 'phone': '1234567890', 'address': '沈阳', 'email': '308768698@qq.com', 'play': '听音乐'}
#
#
# #     删除对象属性
#     del p1.name
#     # print(p1.__dict__) #{'age': 18, 'sex': '女', 'phone': '1234567890', 'address': '沈阳', 'email': '308768698@qq.com', 'play': '听音乐'}
#
# #     使用类属性
# #     print(p1.money) #100
# # 通过类直接调用 类属性
# #     print(Person.money) #100
#
#      # 修改类属性
# p1.money=200 #给对象本身加了一个对象属性
# # print(Person.money) #100
# # print(p1.__dict__) #{'age': 18, 'sex': '女', 'phone': '1234567890', 'address': '沈阳', 'email': '308768698@qq.com', 'play': '听音乐', 'money': 200}
# """
# 对象拥有实例属性和类属性重复的时候，优先使用对象的属性
# 对象属性>实例属性
# 所以上面的Person.money还是100
# """
# # 通过类 将类属性改掉
# Person.money=200
# # print(p1.money) #200，这个时候再去使用对象访问类属性，会发现有改变
# # print(Person.money) #200
# """"
# class Person:
#     money = 100
# p1 = Person()
# p2 = Person()
# # 修改类属性
# Person.money = 200
# print(p1.money)  # 输出: 200
# print(p2.money)  # 输出: 200
# # 现在给 p1 单独设置 money
# p1.money = 300
# print(p1.money)  # 输出: 300 （用自己的）
# print(p2.money)  # 输出: 200 （还是用类的） 类属性就像是一个全局变量，所有实例默认都可以访问它，除非自己重新定义了同名属性。类属性是“共享”的
# print(Person.money)  # 输出: 200
# """
# # 打印course返回值
# # print(p1.course()) #小白
#
# # 删除类属性
# del Person.money
# # print(Person.money) #报错
#
# # 新增类属性
# Person.eat="吃饭"
# # print(Person.eat)
# # print(p1.eat) #新增之后的类属性，对象也可以访问
# # print(Person.__dict__) #查看类属性














